#ifndef ANNOTATIONIMAGE_H
#define ANNOTATIONIMAGE_H

#include <opencv2/opencv.hpp>
#include "imageannotation.h"
#include "imageannentry.h"

class ImageAnnotation;

// 表示标注软件中正在标注的图像，包含图像的尺寸、文件名、图像数据矩阵等信息，并提供对图像的平移、缩放、旋转等操作。
class AnnotationImage
{
public:
    /*----------------构造函数-----------------*/
    // 默认构造函数
    AnnotationImage() = default;
    // 接收标注图片文件名的构造函数
    AnnotationImage(const string& file) : imageFileName(file) { read(); }

    /*----------------成员函数-----------------*/
    // 读取一张图像
    bool read();

    // 将标记在图片中画出来, 返回画好之后的图片
    cv::Mat drawAnnInImage(int index);
    cv::Mat drawAnnInImage(ImageAnnItem &polyData, int index);

    // 图像旋转
    void ratate();

    // 图像移动，deltaX, deltaY分别表示图像在x和y方向上移动的距离
    void translate(int deltaX, int deltaY);

    /*-----------------getter-----------------*/
    // 得到当前正在标注的图像文件名
    const string& getImageFileName() const
    {
        return imageFileName;
    }

    // 得到当前正在标注的图片数据
    const cv::Mat& getImageData() const
    {
        return imageData;
    }

    // 得到当前图像旋转角度
    double getRatateAngle() const
    {
        return ratateAngle;
    }

    // 得到当前标注图像的标注类
    ImageAnnotation* getPImageAnn() const
    {
        return pImageAnn;
    }

    /*-----------------setter-----------------*/
    // 设置当前标注图像的标注数据类
    void setPImageAnn(ImageAnnotation * p)
    {
        this->pImageAnn = p;
    }
    // 设置图片数据
    void setImageData(const cv::Mat &d)
    {
        imageData = d;
    }

private:
    // 在tmp中绘制items中第items个标注项
    void drawDataInImage(cv::Mat &tmp, vector<ImageAnnEntry> &items, int index);


private:
    // 图像文件名
    string imageFileName;

    // 图像数据
    cv::Mat imageData;

    // 图像旋转角度
    double ratateAngle;

    // 对应的图像标注
    ImageAnnotation * pImageAnn;
};

// 根据图片文件名得到标注数据文件名
inline string getAnnNameByImageName(string &imageFileName)
{
    return imageFileName + ".dat";
}

#endif // ANNOTATIONIMAGE_H
